package com.house.framework.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.StatementType;
import org.springframework.stereotype.Repository;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Repository
@Mapper
public interface MapperBase<T> extends BaseMapper<T> {

    @Select("{call P_PageList(#{QueryStr,mode=IN,jdbcType=VARCHAR},#{PageSize,mode=IN,jdbcType=INTEGER},#{PageCurrent,mode=IN,jdbcType=INTEGER},#{FdShow,mode=IN,jdbcType=VARCHAR},#{FdOrder,mode=IN,jdbcType=VARCHAR},#{RecordCount,mode=OUT,jdbcType=INTEGER},#{PageCount,mode=OUT,jdbcType=INTEGER})}")
    @Options(statementType = StatementType.CALLABLE)
    List<Map<String, Object>> procedurePage(Map<String,Object> params);

    /**
     * sql 查询行数据
     * @param sql
     * @return
     */
    @Select("${sql}")
    Map<String, Object> queryRow(@Param("sql") String sql);

    /**
     * sql 查询集合数据
     * @param sql
     * @return
     */
    @Select("${sql}")
    List<Map<String, Object>> queryList(@Param("sql") String sql);

    /**
     * sql 更新
     * @param sql
     * @return
     */
    @Update("${sql}")
    int updateBySql(@Param("sql") String sql);

    /**
     * sql 新增
     * @param sql
     * @return
     */
    @Insert("${sql}")
    int insertBySql(@Param("sql") String sql);

    /**
     * sql 删除
     * @param sql
     * @return
     */
    @Delete("${sql}")
    int deleteBySql(@Param("sql") String sql);

    /**
     * 查询sql
     * @param sql
     * 分页取数
     * @param page
     * 分页参数；
     * @param wrapper
     * 条件参数；
     * @return
     * 返回分页数据
     */
//    @Select("${sql} ${ew.customSqlSegment}")
//    IPage<Map> page(@Param("sql")String sql, IPage<Map> page, @Param(Constants.WRAPPER) Wrapper<Map> wrapper);


    /**
     * 按条件修改相应数据的值
     * @param tableName 需要改变的数据库表名
     * @param columns 需要改变的数据库字段及其对应的值的map集合
     * @param params 查询where条件的map集合
     * @return 影响行数
     */
    int updateForParams(@Param("tableName") String tableName, @Param("columns") Map columns, @Param("params") Map params);

    /**
     * 按条件修改相应数据的值
     * @param tableName 需要改变的数据库表名
     * @param columns 需要改变的数据库字段及其对应的值的map集合
     * @param key 根据key更新
     * @return 影响行数
     */
    int updateForKey(@Param("tableName") String tableName,@Param("id") String key, @Param("columns") Map<String,Object> columns);

    /**
     * 按条件修改相应数据的值
     * @param tableName 需要改变的数据库表名
     * @param columns 需要改变的数据库字段及其对应的值的map集合
     * @param key 根据key更新
     * @return 影响行数
     */
    int updateForKeyAllowNullVal(@Param("tableName") String tableName,@Param("id") String key, @Param("columns") Map<String,Object> columns);


    /**
     * 根据表明新增
     * @param tableName 数据库表名
     * @param columns 数据库字段及其对应的值的map集合
     * @return 影响行数
     */
    int insertForParams(@Param("tableName") String tableName, @Param("columns") Map columns);


    /**
     * 按条件修改相应数据的值
     * @param tableName 需要删除的数据库表名
     * @param params 查询where条件的map集合
     * @return 影响行数
     */
    int deleteForParams(@Param("tableName") String tableName, @Param("params") Map params);


    Map<String,Object> selectRowForParams(@Param("tableName") String tableName, @Param("params") Map params);

    List<Map<String,Object>> selectForParams(@Param("tableName") String tableName, @Param("params") Map params);


    IPage<Map<String, Object>> pageList(IPage page, @Param("sql") String sql);

    @Select("{call Proc_Build_BuildCode(#{v_F_BDBH,mode=OUT,jdbcType=VARCHAR})}")
    @Options(statementType = StatementType.CALLABLE)
    void Proc_Build_BuildCode(Map<String,Object> params);


    @Select("{call Proc_Build_BillCode(#{v_F_BDLX,mode=IN,jdbcType=INTEGER},#{v_F_BDBH,mode=OUT,jdbcType=VARCHAR})}")
    @Options(statementType = StatementType.CALLABLE)
    void Proc_Build_BillCode(Map<String,Object> params);

    @Select("{call Proc_Task_Delete(#{v_F_JOBID,mode=IN,jdbcType=VARCHAR})}")
    @Options(statementType = StatementType.CALLABLE)
    void Proc_Task_Delete(@Param("v_F_JOBID") String mF_JOBID);

    @Select("{call P_Public_BuildTaskCode(#{v_F_UnitID,mode=IN,jdbcType=INTEGER},#{returnCoce,mode=OUT,jdbcType=VARCHAR})}")
    @Options(statementType = StatementType.CALLABLE)
    void P_Public_BuildTaskCode(Map<String,Object> params);


    @Select("{call CreateMinute(#{F_MONITORSTATIONID,mode=IN,jdbcType=VARCHAR},#{F_SEARCHTIME,mode=IN,jdbcType=VARCHAR})}")
    @Options(statementType = StatementType.CALLABLE)
    List<Map<String, Object>> Proc_CreateMinute(LinkedHashMap<String, Object> params);

}
